﻿namespace IS.Projecto.DataAccessLayer.impl
{
    using System;
    using System.Collections.Generic;
    using Modelo;
    using Spring.Stereotype;
    using Spring.Transaction.Interceptor;

    //falta acrescentar as propriedades dos Daos ao repositorio e implementar os metodos

    [Repository]
    public class DataRepository : IDataRepository
    {
        #region Fields

        private IGenericDao<Docente> _docenteDao;
        private IHorarioDao _horarioDao;
        private IInscricaoDao _inscricaoDao;
        private IGenericDao<Curso> _cursoDao;
        private IGenericDao<Sala> _salaDao;
        private IUnidadeCurricularDao _unidadecurricularDao;

        #endregion

        #region Properties

        public IGenericDao<Docente> DocenteDao
        {
            set { _docenteDao = value; }
        }

        public IHorarioDao HorarioDao
        {
            set { _horarioDao = value; }
        }

        public IInscricaoDao InscricaoDao
        {
            set { _inscricaoDao = value; }
        }

        public IGenericDao<Curso> CursoDao
        {
            set { _cursoDao = value; }
        }

        public IGenericDao<Sala> SalaDao
        {
            set { _salaDao = value; }
        }

        public IUnidadeCurricularDao UnidadeCurricularDao
        {
            set { _unidadecurricularDao = value; }
        }

        #endregion

        #region Operações de Docentes

        public Docente ReadDocente(int id)
        {
            return _docenteDao.Read(id);
        }

        public IList<Docente> ListAllDocentes()
        {
            return _docenteDao.GetAll();
        }

        [Transaction]
        public void WriteDocente(Docente docente)
        {
            _docenteDao.Write(docente);
        }

        [Transaction]
        public void WriteDocentes(IList<Docente> docentes)
        {
            foreach (var obj in docentes)
            {
                _docenteDao.Write(obj);
            }
        }

        #endregion

        #region Operações de Horarios

        public Horario ReadHorario(int id)
        {
            return _horarioDao.Read(id);
        }

        public IList<Horario> ListHorarios(Curso curso, DateTime start, DateTime end)
        {
            var ucs = ListUnidadesCurriculares(curso);
            return _horarioDao.GetHorarios(ucs, start, end);
        }

        [Transaction]
        public void WriteHorario(Horario horario)
        {
            _horarioDao.Write(horario);
        }

        [Transaction]
        public void WriteHorarios(IList<Horario> horarios)
        {
            foreach (var obj in horarios)
            {
                _horarioDao.Write(obj);
            }
        }

        #endregion

        #region Operações de Inscricões

        public Inscricao ReadInscricao(int id)
        {
            return _inscricaoDao.Read(id);
        }

        public IList<Inscricao> ListInscricoes(Curso curso)
        {
            return _inscricaoDao.GetInscricoes(curso);
        }

        [Transaction]
        public void WriteInscricao(Inscricao inscricao)
        {
            _inscricaoDao.Write(inscricao);
        }

        [Transaction]
        public void WriteInscricoes(IList<Inscricao> inscricoes)
        {
            foreach (var obj in inscricoes)
            {
                _inscricaoDao.Write(obj);
            }
        }

        #endregion

        #region Operações de Cursos

        public Curso ReadCurso(int id)
        {
            return _cursoDao.Read(id);
        }

        public IList<Curso> ListAllCursos()
        {
            return _cursoDao.GetAll();
        }

        [Transaction]
        public void WriteCurso(Curso curso)
        {
            _cursoDao.Write(curso);
        }

        [Transaction]
        public void WriteCursos(IList<Curso> curso)
        {
            foreach (var obj in curso)
            {
                _cursoDao.Write(obj);
            }
        }

        #endregion

        #region Operações de Salas

        public Sala ReadSala(int id)
        {
            return _salaDao.Read(id);
        }

        public IList<Sala> ListAllSalas()
        {
            return _salaDao.GetAll();
        }

        [Transaction]
        public void WriteSala(Sala sala)
        {
            _salaDao.Write(sala);
        }

        [Transaction]
        public void WriteSalas(IList<Sala> sala)
        {
            foreach (var obj in sala)
            {
                _salaDao.Write(obj);
            }
        }

        #endregion

        #region Operações de Unidades Curriculares

        public UnidadeCurricular ReadUnidadeCurricular(int id)
        {
            return _unidadecurricularDao.Read(id);
        }

        public IList<UnidadeCurricular> ListUnidadesCurriculares(Curso curso)
        {
            return _unidadecurricularDao.GetUnidadesCurriculares(curso);
        }

        [Transaction]
        public void WriteUnidadeCurricular(UnidadeCurricular uc)
        {
            _unidadecurricularDao.Write(uc);
        }

        [Transaction]
        public void WriteUnidadeCurriculares(IList<UnidadeCurricular> uc)
        {
            foreach (var obj in uc)
            {
                _unidadecurricularDao.Write(obj);
            }
        }

        #endregion
    }
}